#include "ds18b20_menu.h"
#include "menu_config.h"
#include "./BSP/DS18B20/ds18b20.h"
#include "./SYSTEM/Task/cot_task.h"

/* 显示刷新标志 */
static bool sg_needRefresh = true;
/* 全屏刷新标志 */
static bool needFullRefresh = true;

/* 定义空的菜单项 */
static cotMenuList_t sg_DS18B20MenuTable[] =
{
    COT_MENU_ITEM_BIND(TEXT_DS18B20_TEMP, NULL, NULL, NULL, NULL, "DS18B20 Temperature"),
};

/**
 * @brief       DS18B20温度显示任务
 * @details     读取DS18B20温度并通过串口和LCD显示，同时检测传感器连接状态
 * @param       无
 * @retval      无
 */
void DS18B20_TempDisplayTask(void)
{
    short temp;
    float temperature;
    static char temp_str[20];
    static uint8_t init_status = 1;  /* 初始值为1表示未初始化，0表示正常，其他值表示错误 */
    
    /* 未初始化或传感器异常时尝试初始化 */
    if (init_status != 0)
    {
        init_status = ds18b20_init();  /* 初始化DS18B20并获取状态 */
    }
    
    if (init_status == 0)   /* 传感器正常 */
    {
        /* 获取温度值 */
        temp = ds18b20_get_temperature();
        
        /* 检查温度是否有效，无效则可能是传感器出现问题 */
        if (temp == 0 || temp == 850)   /* 850对应85.0度，是DS18B20的默认值 */
        {
            printf("Temperature error, reinitialization needed\r\n");
            init_status = 1;/* 标记需要重新初始化 */
            return;         /* 本次不显示温度 */
        }
        
        /* 转换为实际温度值（除以10） */
        temperature = temp * 0.1f;
        
        /* 打印温度值到串口 */
        printf("Temp: %.1f C \r\n", temperature);
        
        /* 在LCD上显示温度值 */
        sprintf(temp_str, "Temp: %.1f C  ", temperature);
        LCD_ShowString(10, 80, (uint8_t *)temp_str, g_point_color, g_back_color, 32, 0);
    }
    else    /* 传感器异常或未连接 */
    {
        /* 打印错误信息到串口 */
        printf("DS18B20 Error: Sensor not found!\r\n");
        
        /* 在LCD上显示错误信息 */
        sprintf(temp_str, "Sensor Error!");
        LCD_ShowString(10, 80, (uint8_t *)temp_str, RED, g_back_color, 32, 0);
    }
}

/* 按键回调函数 - 返回键(KEY2) */
static void OnKey2FunCB(cotKey_t key)
{
    /* 处理按键短按和长按 */
    if (!cotKey_IsLongPress(key))
    {
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_PRESS)) /* 按下首次触发 */
        {
            /* 预留：首次按下按键时的处理 */
        }
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_LOSSEN)) /* 识别到短按 */
        {
            /* 返回上级菜单 */
            cotMenu_Exit(false);
        }
    }
    else
    {
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_PRESS)) /* 识别到长按 */
        {
            while (cotMenu_Exit(true) == 0)
            {
            }
        }
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_LOSSEN)) /* 长按松开 */
        {
            /* 预留：长按确认键松手时的处理 */
        }
    }
}

/* 显示回调函数 */
static void ShowDS18B20Menu(cotMenuShow_t *ptShowInfo)
{
    /* 如果不需要刷新显示，直接返回 */
    if (!sg_needRefresh)
    {
        return;
    }
    
    /* 只有在首次显示或标记需要全刷时才清屏并绘制所有内容 */
    if (needFullRefresh)
    {
        /* 清屏 */
        LCD_Clear();
        
        /* 显示标题 */
        const char *pszTitle = get_text(TEXT_DS18B20_TEMP);
        uint16_t titleX = CALC_TITLE_CENTER_X(pszTitle, LCD_W);
        LCD_ShowString(titleX, 0, (uint8_t *)pszTitle, g_point_color, g_back_color, MENU_FONT_SIZE, 0);
        
        /* 在标题下方画一条横线 */
        LCD_DrawLine(0, MENU_FONT_SIZE, LCD_W - 1, MENU_FONT_SIZE, g_point_color);
        
        needFullRefresh = false;
    }
    
    /* 清除刷新标志 */
    sg_needRefresh = false;
}

/* 进入回调函数 */
void OnDS18B20MenuEnter(const cotMenuItemInfo_t *ptItemInfo)
{
    /* 绑定菜单表和显示函数 */
    cotMenu_Bind(sg_DS18B20MenuTable, COT_GET_MENU_NUM(sg_DS18B20MenuTable), ShowDS18B20Menu);
    
    /* 创建DS18B20温度显示任务 */
    cotTask_Creat(DS18B20_TempDisplayTask, 100, 10);
}

/* 退出回调函数 */
void OnDS18B20MenuExit(const cotMenuItemInfo_t *ptItemInfo)
{
    /* 销毁DS18B20温度显示任务 */
    cotTask_Destory(DS18B20_TempDisplayTask);
}

/* 加载回调函数 */
void LoadDS18B20Menu(const cotMenuItemInfo_t *ptItemInfo)
{
    /* 注册返回键回调 */
    cotKey_Listen(KEY2, OnKey2FunCB);
    
    /* 配置按键模式 */
    cotKey_ConfigLongPressMode(KEY2, 2000, 0);  /* 设置KEY2键2秒长按，不重复触发 */
    
    /* 标记需要刷新且全屏刷新 */
    sg_needRefresh = true;
    needFullRefresh = true;
} 
